/**
 * Created by jinxs on 14-7-2.
 * 依赖
 * ui.core.js
 */
(function ($) {
    /**
     * @class 位置组件
     * @requires {@link uiCore}
     * @constructor uiPosition
     * @summary 构造函数
     * @param [options] {Object|String} 组件配置参数|要调用的组件方法名
     * @param [param] {Object} 表示要调用的组件方法的参数
     * @example
     * $('position').uiPosition({horizontal:3});
     */
    $.fn.uiPosition = function (options, param) {
        if (typeof options == 'string') {
            return $.fn.uiPosition.methods[options](this, param);
        }
        return this.each(function(){
            var me = $(this);
            _init(me, $.extend({}, $.fn.uiPosition.defaults, me.parseUIConfig(), options||{}));
        });
    };
    /**
     * 默认配置
     * @lends uiPosition.prototype
     */
    $.fn.uiPosition.defaults = {
        /**
         * @type Object
         * @default body
         * @summary 组件的父容器
         */
        container: $('body'),
        /**
         * @type Boolean
         * @default false
         * @summary 是否位置固定
         */
        fixed: false,
        /**
         * @type Number
         * @default 0
         * @summary 组件的垂直坐标
         */
        top: 0,
        /**
         * @type Number
         * @default 0
         * @summary 组件的水平坐标
         */
        left: 0,
        /**
         * 位置枚举：<br/><br/>
         * <TABLE cellSpacing="1" width="100%" class="params">
         * <TR>
         * <TH width="12%">名称</TH>
         * <TH width="88%">说明</TH></TR>
         * <TR><TD align=center>left</TD><TD>水平靠左</TD></TR>
         * <TR><TD align=center>center</TD><TD>水平中间</TD></TR>
         * <TR><TD align=center>right</TD><TD>水平靠右</TD></TR>
         * </TABLE>
         * @type String
         * @default ""
         * @summary 组件的水平位置
         */
        horizontal: '',
        /**
         * 位置枚举：<br/><br/>
         * <TABLE cellSpacing="1" width="100%" class="params">
         * <TR>
         * <TH width="12%">名称</TH>
         * <TH width="88%">说明</TH></TR>
         * <TR><TD align=center>top</TD><TD>垂直靠上</TD></TR>
         * <TR><TD align=center>center</TD><TD>垂直靠中</TD></TR>
         * <TR><TD align=center>bottom</TD><TD>垂直靠下</TD></TR>
         * </TABLE>
         * @type String
         * @default ""
         * @summary 组件的垂直位置
         */
        vertical: ''
    };
//////--------------------------------内部方法------------------------------
    /**
     * 初始化
     * @param target 目标对象
     * @param options
     */
    var _init = function (target, options) {
        var container = options.container;
        var isBody = $.nodeName(container[0], 'body');
        var parentW, parentH, top, left;

        if (container.css('position') === 'static') {
            container.css('position', 'absolute');
        }
        target.offsetParent().each(function () {
            if (this !== container[0]) {
                container.append(target.detach());
            }
        });
        if (isBody) {
            parentW = $('body').width();
            parentH = $('body').height();
        } else {
            parentW = container.outerWidth();
            parentH = container.outerHeight();
        }
        if (options.horizontal != "") {
            switch (options.horizontal) {
                case 'left':
                    left = 0;
                    break;
                case 'center':
                    left = (parentW - target.outerWidth()) / 2;
                    break;
                case  'right':
                    left = parentW - target.outerWidth();
                    break;
            }
        } else {
            left = options.left || 0;
        }
        if (options.vertical != "") {
            switch (options.vertical) {
                case 'top':
                    top = 0;
                    break;
                case 'center':
                    top = (parentH - target.outerHeight()) / 2;
                    break;
                case  'bottom':
                    top = parentH - target.outerHeight();
                    break;
            }
        } else {
            top = options.top || 0;
        }
        var hasScroll = container.hasScroll();
        if (!isBody && hasScroll.indexOf('x') > -1 && options.horizontal == 'right') {
            left -= 20;
        }
        if (!isBody && hasScroll.indexOf('y') > -1 && options.vertical == 'bottom') {
            top -= 20;
        }
        if (options.fixed) {
            if (_IEunder6) {
                var style = target[0].style;
                style.position = 'absolute';
                style.removeExpression('left');
                style.removeExpression('top');
                if (isBody) {
                    style.setExpression('left', 'eval(document.documentElement.scrollLeft + '
                    + left + ') +"px"');
                    style.setExpression('top', 'eval(document.documentElement.scrollTop + '
                    + top + ') +"px"');
                } else {
                    style.setExpression('left', 'eval(this.parentNode.scrollLeft + '
                    + left + ') +"px"');
                    style.setExpression('top', 'eval(this.parentNode.scrollTop + '
                    + top + ') +"px"');
                }
            } else {
                var pos = container.position();
                top += pos.top;
                left += pos.left;
                target.css({position: 'fixed', left: left, top: top});
            }
        } else {
            if (isBody) {
                top += $(document).scrollTop();
                left += $(document).scrollLeft();
            } else {
                top += container.scrollTop();
                left += container.scrollLeft();
            }
            target.css({position: 'absolute', left: left, top: top});
        }
        return target;
    };
})(jQuery);
